// 项目开发依赖
var gulp = require("gulp");
var ts = require('gulp-typescript');
// 读取 tsconfig.json 文件   ts 配置源文件
var tsProject = ts.createProject('tsconfig.json', { noImplicitAny: true });

var browserify = require('browserify');
var source = require('vinyl-source-stream');
var tsify = require('tsify');

// watchify是一个browserify的封装
var watchify = require('watchify');
// 最基础的工具  打日志
var gutil = require('gulp-util');
// 专业压缩 Javascript
var uglify = require('gulp-uglify');
// 处理 JavaScript 时生成 SourceMap
var sourcemaps = require('gulp-sourcemaps');
var buffer = require('vinyl-buffer');

var paths = {
    pages: ['src/*.html']
};
// 添加自定义 browserify 选项  assign插件
var opts = {
    basedir: '.',
    debug: true,
    entries: ['src/main.ts'],
    cache: {},
    packageCache: {}
}
var watchedBrowserify = watchify(browserify(opts).plugin(tsify));

// 复制 paths路径源文件
gulp.task('copy-html', function() {
    return gulp.src(paths.pages)
        .pipe(gulp.dest('build'));
});

// js输出生成文件路径及文件名称
function bundle() {
    return watchedBrowserify
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest("build/browserify"));
}

// 默认编译ts文件(适用于node环境)
gulp.task("tsc", function() {
    return tsProject.src()
        //  编译 ts文件
        .pipe(ts(tsProject))
        .js.pipe(gulp.dest("build/js"));
});

// 命名空间合并（）
gulp.task('build', () => {
    return gulp.src('src/namespace/Test.ts')
        .pipe(ts({
            noImplicitAny: true,
            suppressImplicitAnyIndexErrors: true,
            removeComments: true,
            jsx: 'react',
            target: 'ES5',
            outFile: 'build.js'
        }))
        .pipe(gulp.dest("build/browserify"));
})

gulp.task('react', () => {
    return gulp.src('src/index.tsx')
        .pipe(ts({
            noImplicitAny: true,
            suppressImplicitAnyIndexErrors: true,
            removeComments: true,
            jsx: 'react',
            target: 'ES5',
            outFile: 'bundle.js'
        }))
        .pipe(gulp.dest("dist"));
})

// todos
gulp.task('todos', () => {
    return gulp.src('src/todomvc/js/todos.ts')
        .pipe(ts({
            noImplicitAny: true,
            suppressImplicitAnyIndexErrors: true,
            removeComments: true,
            jsx: 'react',
            target: 'ES5',
            outFile: 'todos.js'
        }))
        .pipe(gulp.dest("src/todomvc/js"));
})


// 构建react
gulp.task('react_build', () => {
    return gulp.src(['src/react/app.tsx'])
        .pipe(ts({
            noImplicitAny: true,
            removeComments: true,
            suppressImplicitAnyIndexErrors: true,
            jsx: 'react',
            target: 'ES5',
            outFile: 'app.js',

        }))
        .pipe(gulp.dest('src/react/public'));
});
// 监听构建react
gulp.task('react_watch', () => {
    var watcher = gulp.watch('src/react/*.tsx', ['react_build']);
    watcher.on('change', () => {
        console.log('file change');
    })
});


// 添加监听(适用于浏览器环境)
gulp.task("default-watchify", ["copy-html"], bundle);

// ["copy-html"],(适用于浏览器环境)
gulp.task("default", function() {

    // 在这里添加自定义 browserify 选项
    var customOpts = {
        basedir: '.',
        debug: true,
        entries: ['src/namespace/Test.ts'],
        cache: {},
        packageCache: {}
    };
    return browserify(customOpts)
        .plugin(tsify)
        // 在这里加入变换操作
        .transform('babelify')
        .bundle()
        .pipe(source('bundle.js'))
        // 可选项，如果你不需要缓存文件内容，就删除
        // .pipe(buffer())
        // 可选项，如果你不需要 sourcemaps，就删除
        // .pipe(sourcemaps.init({ loadMaps: true })) // 从 browserify 文件载入 map
        // .pipe(uglify())
        // .pipe(sourcemaps.write('./')) //写入 .map 文件
        .pipe(gulp.dest("build/browserify"));
});
// 当任何依赖发生改变的时候，运行打包工具
watchedBrowserify.on("update", bundle);
// 输出编译日志到终端
watchedBrowserify.on("log", gutil.log);


